package com.baiyue.interceptor;

import com.alibaba.fastjson.JSON;
import com.baiyue.entity.UserEntity;
import com.baiyue.result.CodeMsg;
import com.baiyue.result.Result;
import com.baiyue.service.UserService;
import com.baiyue.utils.UserHolderUtil;
import org.apache.commons.lang3.StringUtils;
import org.springframework.web.servlet.HandlerInterceptor;
import org.springframework.web.servlet.ModelAndView;

import javax.servlet.http.Cookie;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.util.Objects;

/**
 * @author 伍波
 * @date 2023/6/5 17:56
 */
public class LoginInterceptor implements HandlerInterceptor {
    public static final String COOKIE_NAME_TOKEN = "token";

    /**
     * 这里需要自己定义一个 UserService，用于查询用户信息
     */
    private UserService userService;

    public LoginInterceptor(UserService userService) {
        this.userService = userService;
    }

    /**g
     * 在 Controller 方法执行前拦截请求
     * @param request
     * @param response
     * @param handler
     * @return
     * @throws Exception
     */
    @Override
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
        String paramToken = request.getParameter(LoginInterceptor.COOKIE_NAME_TOKEN);
        Cookie[] cookie = request.getCookies();
        // 验证 Token 是否存在及有效性
        if (StringUtils.isEmpty(paramToken) && Objects.isNull(cookie)) {
            // 如果 Token 不存在，则返回未登录错误信息
            response.setContentType("application/json;charset=UTF-8");
            response.getWriter().write(JSON.toJSONString(Result.error(CodeMsg.USER_NOT_LOGIN)));
            // 返回 false 终止请求继续执行
            return false;
        } else {
            // 如果 Token 存在，则查询用户信息，并将用户信息存入 UserHolder 中
            UserEntity user = userService.getLoginUser(request);
            if (Objects.nonNull(user)) {
                UserHolderUtil.setUser(user);
                // 返回 true，继续执行请求
                return true;
            } else {
                // 如果 Token 无效，则返回错误信息
                response.setContentType("application/json;charset=UTF-8");
                response.getWriter().write(JSON.toJSONString(Result.error(CodeMsg.USER_NOT_LOGIN)));
                // 返回 false，终止请求继续执行
                return false;
            }
        }
    }

    /**
     * 在 Controller 方法执行后，视图渲染前拦截请求
     * @param request
     * @param response
     * @param handler
     * @param modelAndView
     * @throws Exception
     */
    @Override
    public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {
        // 清除 UserHolder 中存储的用户信息
        UserHolderUtil.clear();
    }
}